package phonemsg

import (
	"fmt"
	"log"
	"strings"

	"gitee.com/daofeixian/dfx_golang_toolset/sendmsg"
	dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v5/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
)
// AliyunSendPhoneMsg 阿里云短信发送客户端，用于通过阿里云短信服务发送短信。
type AliyunSendPhoneMsg struct {
	TemplateCode string                        // 短信模板代码，用于指定短信内容的模板
	PhoneNumbers string                        // 手机号列表（已废弃，使用SendInfo中的PhoneNumbers）
	SignName     string                        // 短信签名，显示在短信开头
	Client       *dysmsapi20170525.Client      // 阿里云短信客户端实例
}

// NewAliyunSendPhoneMsg 创建一个新的阿里云短信发送客户端实例
// templateCode: 短信模板代码
// phoneNumbers: 手机号列表（已废弃，仅为了兼容旧版本保留）
// 返回值: 指向AliyunSendPhoneMsg结构体的指针
func NewAliyunSendPhoneMsg(templateCode, phoneNumbers string) *AliyunSendPhoneMsg {
	return &AliyunSendPhoneMsg{
		TemplateCode: templateCode,
		PhoneNumbers: phoneNumbers, // 保持兼容性，但推荐使用SendInfo中的PhoneNumbers
	}
}

// SendMsg 实现SendMsgTer接口，用于发送短信
// sendinfo: 包含短信发送所需信息的结构体指针，如手机号、模板参数等
// 返回值: 发送过程中发生的错误，如果发送成功则返回nil
func (a *AliyunSendPhoneMsg) SendMsg(sendinfo *sendmsg.SendInfo) error {
	// 检查客户端是否已初始化
	if a.Client == nil {
		return fmt.Errorf("阿里云短信客户端未初始化")
	}
	
	// 检查发送信息是否为空
	if sendinfo == nil {
		return fmt.Errorf("发送信息不能为空")
	}

	// 渲染模板内容
	content := JsonDataToTemplate(sendinfo.Msg, sendinfo.Template)
	if content == "" || strings.Contains(content, "错误") {
		log.Printf("模板渲染失败或有错误: %s", content)
		content = DefaultFailureMsg
	}

	// 获取手机号列表
	phoneNumbers := strings.Join(sendinfo.PhoneNumbers, ",")
	if phoneNumbers == "" {
		phoneNumbers = a.PhoneNumbers // 兼容旧版本
	}
	
	if phoneNumbers == "" {
		return fmt.Errorf("手机号不能为空")
	}

	// 构建发送请求
	sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
		TemplateParam: tea.String(content),
		SignName:      tea.String(a.SignName),
		PhoneNumbers:  tea.String(phoneNumbers),
		TemplateCode:  tea.String(a.TemplateCode),
	}

	runtime := &util.RuntimeOptions{}
	
	// 发送短信
	resp, err := a.Client.SendSmsWithOptions(sendSmsRequest, runtime)
	if err != nil {
		return fmt.Errorf("发送短信失败: %w", err)
	}

	log.Printf("短信发送成功，响应: %+v", resp)
	return nil
}
